package com.gxd.business.service.impl;

import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjUtil;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gxd.business.domain.Product;
import com.gxd.business.domain.qco.ProductQco;
import com.gxd.business.enums.DeletedEnum;
import com.gxd.business.mapper.ProductMapper;
import com.gxd.business.service.ProductService;
import com.gxd.common.utils.bean.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collections;
import java.util.List;

/**
 * @author gxd
 * @since 2025/6/13
 */
@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {

    @Autowired
    private ProductMapper productMapper;

    /**
     * 分页列表-产品列表
     *
     * @param qco 产品查询条件
     * @return 产品列表
     */
    @Override
    public List<Product> pageList(ProductQco qco) {
        // 查询分页产品数据
        Page<Product> productPage = productMapper.pageList(new Page<>(qco.getPageNum(), qco.getPageSize()), qco);
/*        // 字段翻译
        List<Product> products = this.refreshInfo(productPage.getRecords());*/

        return ObjUtil.isEmpty(productPage.getRecords()) ? Collections.emptyList() : productPage.getRecords();
    }

/*
    */
/**
     * 格式化数据：翻译
     *
     * @param records 产品集合
     * @return 产品集合
     *//*

    private List<Product> refreshInfo(List<Product> records) {
        // 数据为空，返回空集合
        if (CollUtil.isEmpty(records)) return Collections.emptyList();
        // 获取字典Map，先从缓存中获取，缓存中没有再从数据库中获取
        Map<String, String> productTypeMap = dictDataService.getDictValueLabelMap(DictConstants.PRODUCT_TYPE);
        Map<String, String> productStatusMap = dictDataService.getDictValueLabelMap(DictConstants.PRODUCT_STATUS);
        // 字段翻译
        return records.stream()
                .map(productInfo -> {
                    productInfo.setProductTypeMc(productTypeMap.get(String.valueOf(productInfo.getProductType())));
                    productInfo.setStatusMc(productStatusMap.get(String.valueOf(productInfo.getStatus())));
                    return productInfo;
                })
                .collect(Collectors.toList());
    }
*/

    /**
     * 详情信息-根据Id获取产品详情信息
     *
     * @param id 产品Id
     * @return 产品详情
     */
    @Override
    public Product getDetailById(String id) {
        // 根据id获取产品信息
        Product product = this.getById(id);
        // 产品不为空，进行字段翻译
        if (product != null) {
            // return refreshInfo(Arrays.asList(product)).get(0);
            return product;
        }
        // 产品为空，则返回个新对象
        return Product.builder().build();
    }

    /**
     * 添加或修改-产品信息
     *
     * @param product 产品实体
     * @return 产品信息
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Product addOrEdit(Product product) {
        // 校验参数
        Assert.notNull(product, "产品信息不能为空");
        // id不为空，修改
        if (ObjUtil.isNotNull(product.getId())) {
            // 根据id获取产品数据，校验非空
            Product productInfo = Assert.notNull(this.getById(product.getId()), "要修改的产品记录不存在");
            // 拷贝数据
            BeanUtils.copyNotEmptyProperties(product, productInfo);
            // 更新数据
            this.updateById(productInfo);
            return productInfo;
        }
        // 赋值
        product.setGUID();
        product.setDeleted(DeletedEnum.NO.getCode());
        // 新增
        this.save(product);
        return product;
    }

    /**
     * 删除-产品信息（支持批量）
     *
     * @param ids 产品id（多个需逗号分隔）
     * @return 结果
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public boolean deleteById(String ids) {
        // 校验参数
        Assert.notEmpty(ids, "缺少必要参数：请提供要删除的记录Id");
        // 进行逻辑删除
        return this.update(Wrappers.lambdaUpdate(Product.class)
                .set(Product::getDeleted, DeletedEnum.YES.getCode()).in(Product::getId, ids.split(StringPool.COMMA)));
    }
}
